package com.invengo.library_rfid.analyze.utils.uhf.TIAOMHZH;    // #region ====同济大学嘉定馆====


import com.invengo.library_rfid.analyze.utils.uhf.utils.LongUtils;

/// <summary>
    /// 同济大学嘉定馆规则
    /// </summary>
    public class TJU_Jiading {
        /* 同济大学嘉定馆图书条码号简要描述
         *
         * 类型1   : 8位数字
         * 类型2   : A + 7位数字
         * 类型3   : DV + 9位数字
         * 类型4   : E + 7位数字
         * 类型5   : E + 8位数字
         * 类型6   : VC + 9位数字
         * 类型7   : X + 8位数字
         *
         *
         * 8位
         * {
         *      8位数字;		01	0加+数字
         *      A + 7位数字;	02	00 + 数字
         *      E + 7位数字;	04	00 + 数字
         * }

         *
         * 9位
         * {
         *      E + 8位数字;	05	0 + 数字
         *      X + 8位数字;	07	0 + 数字
         * }

         * 11位
         * {
         *      DV + 9位数字;	03	数字
         *      VC + 9位数字;	06	数字
         * }
         */

        /// <summary>
        /// 预处理图书条码号(将条码号转成特定的EPC码)
        /// </summary>
        /// <param name="BookBarCode">条码号</param>
        /// <returns>失败返回0，否则返回转换后的EPC码</returns>
        public static long PretreatmentBookBarCode(String BookBarCode) {
            switch (BookBarCode.length()) {
                case 8: {
                    if (BookBarCode.substring(0, 1).toUpperCase().equals("X")
                            || BookBarCode.substring(0, 1).toUpperCase().equals("D")
                            || BookBarCode.substring(0, 1).toUpperCase().equals("V"))
                        return 0;
                    return GetValueFromLength8(BookBarCode);
                }
                case 9: {
                    if (BookBarCode.substring(0, 1).toUpperCase().equals("D")
                            || BookBarCode.substring(0, 1).toUpperCase().equals("V"))
                        return 0;
                    return GetValueFromLength9(BookBarCode);
                }
                case 11: {
                    return GetValueFromLength11(BookBarCode);
                }
                default: {
                    // MessageBox.Show("未知格式\t" + BookBarCode);
                    return 0;
                }
            }
        }

        /// <summary>
        /// 将8位的条码号转换为EPC码
        /// </summary>
        /// <param name="BookBarCode">条码号</param>
        /// <returns>失败返回0，否则返回转换后的EPC码</returns>
        private static long GetValueFromLength8(String BookBarCode) {
            long CodeNumber = 0;

            switch (BookBarCode.toUpperCase().charAt(0)) {
                case 'A': {
                    if (!LongUtils.TryParse(BookBarCode.substring(1),CodeNumber)) {
                        //Log("未知格式\t" + BookBarCode);
                        return 0;
                    } else {
                        return 2000000000 + CodeNumber;
                    }
                }
                case 'E': {
                    if (!LongUtils.TryParse(BookBarCode.substring(1),CodeNumber)) {
                        //Log("未知格式\t" + BookBarCode);
                        return 0;
                    } else {
                        return 4000000000l + CodeNumber;
                    }
                }
                default: {
                    if (!LongUtils.TryParse(BookBarCode,CodeNumber)) {
                        //Log("未知格式\t" + BookBarCode);
                        return 0;
                    } else {
                        return 1000000000 + CodeNumber;
                    }
                }
            }
        }

        /// <summary>
        /// 将9位的条码号转换为EPC码
        /// </summary>
        /// <param name="BookBarCode">条码号</param>
        /// <returns>失败返回0，否则返回转换后的EPC码</returns>
        private static long GetValueFromLength9(String BookBarCode) {
            long CodeNumber = 0;

            switch (BookBarCode.toUpperCase().charAt(0)) {
                case 'E': {
                    if (!LongUtils.TryParse(BookBarCode.substring(1),CodeNumber)) {
                        //Log("未知格式\t" + BookBarCode);
                        return 0;
                    } else {
                        return 5000000000l + CodeNumber;
                    }
                }
                case 'X': {
                    if (!LongUtils.TryParse(BookBarCode.substring(1),CodeNumber)) {
                        //Log("未知格式\t" + BookBarCode);
                        return 0;
                    } else {
                        return 7000000000l + CodeNumber;
                    }
                }
                default: {
                    //Log("未知格式\t" + BookBarCode);
                    return 0;
                }
            }
        }

        /// <summary>
        /// 将11位的条码号转换为EPC码
        /// </summary>
        /// <param name="BookBarCode">条码号</param>
        /// <returns>失败返回0，否则返回转换后的EPC码</returns>
        private static long GetValueFromLength11(String BookBarCode) {
            long CodeNumber = 0;

            switch (BookBarCode.toUpperCase().substring(0, 2)) {
                case "DV": {
                    if (!LongUtils.TryParse(BookBarCode.substring(2),CodeNumber)) {
                        //Log("未知格式\t" + BookBarCode);
                        return 0;
                    } else {
                        return 3000000000l + CodeNumber;
                    }
                }
                case "VC": {
                    if (!LongUtils.TryParse(BookBarCode.substring(2),CodeNumber)) {
                        //Log("未知格式\t" + BookBarCode);
                        return 0;
                    } else {
                        return 6000000000l + CodeNumber;
                    }
                }
                default: {
                    //Log("未知格式\t" + BookBarCode);
                    return 0;
                }
            }
        }

        /// <summary>
        /// 将EPC码转换成条码号
        /// </summary>
        /// <param name="Value">EPC码</param>
        /// <returns>失败返回""，成功返回条码号</returns>
        public static String GetBarCodeFromValue(long Value) {
            switch ((int) (Value / 1000000000l)) {
                case 1: {
                    return GetBarCodeFromType1(Value);
                }
                case 2: {
                    return GetBarCodeFromType2(Value);
                }
                case 3: {
                    return GetBarCodeFromType3(Value);
                }
                case 4: {
                    return GetBarCodeFromType4(Value);
                }
                case 5: {
                    return GetBarCodeFromType5(Value);
                }
                case 6: {
                    return GetBarCodeFromType6(Value);
                }
                case 7: {
                    return GetBarCodeFromType7(Value);
                }
                default: {
                    //MessageBox.Show("值有错误\t" + Value);
                    return "";
                }
            }
        }

        /// <summary>
        /// 将类型1的EPC码转换成条码号
        /// </summary>
        /// <param name="Value">EPC码</param>
        /// <returns>失败返回""，成功返回条码号</returns>
        private static String GetBarCodeFromType1(long Value) {
            if (Long.toString(Value % 1000000000l).length() > 8) {
                //MessageBox.Show("值有错误\t" + Value);
                return "";
            }

            return String.format("%9s" ,Long.toString(Value % 1000000000l)).replace(" ", "0");
        }

        /// <summary>
        /// 将类型2的EPC码转换成条码号
        /// </summary>
        /// <param name="Value">EPC码</param>
        /// <returns>失败返回""，成功返回条码号</returns>
        private static String GetBarCodeFromType2(long Value) {
            if (Long.toString(Value % 1000000000l).length() > 7) {
                //MessageBox.Show("值有错误\t" + Value);
                return "";
            }

            return "A" + String.format("%7s",Long.toString(Value % 1000000000l)).replace(" ", "0");
        }

        /// <summary>
        /// 将类型3的EPC码转换成条码号
        /// </summary>
        /// <param name="Value">EPC码</param>
        /// <returns>失败返回""，成功返回条码号</returns>
        private static String GetBarCodeFromType3(long Value) {
            return "DV" +  String.format("%9s",Long.toString(Value % 1000000000l)).replace(" ", "0");
        }

        /// <summary>
        /// 将类型4的EPC码转换成条码号
        /// </summary>
        /// <param name="Value">EPC码</param>
        /// <returns>失败返回""，成功返回条码号</returns>
        private static String GetBarCodeFromType4(long Value) {
            if (Long.toString(Value % 1000000000l).length() > 7) {
                //MessageBox.Show("值有错误\t" + Value);
                return "";
            }

            return "E" +  String.format("%9s",Long.toString(Value % 1000000000l)).replace(" ", "0");
        }

        /// <summary>
        /// 将类型5的EPC码转换成条码号
        /// </summary>
        /// <param name="Value">EPC码</param>
        /// <returns>失败返回""，成功返回条码号</returns>
        private static String GetBarCodeFromType5(long Value) {
            if (Long.toString(Value % 1000000000l).length() > 9) {
                //MessageBox.Show("值有错误\t" + Value);
                return "";
            }

            return "E" + String.format("%9s",Long.toString(Value % 1000000000l)).replace(" ", "0");
        }

        /// <summary>
        /// 将类型6的EPC码转换成条码号
        /// </summary>
        /// <param name="Value">EPC码</param>
        /// <returns>失败返回""，成功返回条码号</returns>
        private static String GetBarCodeFromType6(long Value) {
            return "VC" + String.format("%9s" ,Long.toString(Value % 1000000000l)).replace(" ", "0");
        }

        /// <summary>
        /// 将类型7的EPC码转换成条码号
        /// </summary>
        /// <param name="Value">EPC码</param>
        /// <returns>失败返回""，成功返回条码号</returns>
        private static String GetBarCodeFromType7(long Value) {
            if (Long.toString(Value % 1000000000l).length() > 9) {
                //MessageBox.Show("值有错误\t" + Value);
                return "";
            }

            return "X" + String.format("%9s" ,Long.toString(Value % 1000000000l)).replace(" ", "0");
        }
    }
